<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
        <script>
            class Animal {}

            class Dog extends Animal {}

            const dog = new Dog()

            /* 
            instanceof 用来检查一个对象是否是一个类的实例
                - instanceof检查的是对象的原型链上是否有该类实例
                    只要原型链上有该类实例，就会返回true
                - 
                    dog -> Animal的实例 -> Object实例 -> Object原型

                - Object是所有对象的原型，所以任何和对象和Object进行instanceof运算都会返回true
        */

            // console.log(dog instanceof Dog) // true
            // console.log(dog instanceof Animal) // true
            // console.log(dog instanceof Object) // true

            const obj = new Object()

            // console.log(obj.__proto__)
            // console.log(Object.prototype)

            // dog.__proto__ / Dog.prototype

            class Person {
                name = "孙悟空"
                age = 18

                sayHello() {
                    console.log("Hello，我是", this.name)
                }
            }

            const p = new Person()

            /* 
                in
                    - 使用in运算符检查属性时，无论属性在对象自身还是在原型中，都会返回true

                对象.hasOwnProperty(属性名) (不推荐使用)
                    - 用来检查一个对象的自身是否含有某个属性

                Object.hasOwn(对象, 属性名) 
                    - 用来检查一个对象的自身是否含有某个属性

            */
            // console.log("sayHello" in p)

            // console.log(p.hasOwnProperty("sayHello"))
            // console.log(p.__proto__.__proto__.hasOwnProperty("hasOwnProperty"))

            console.log(Object.hasOwn(p, "sayHello"))
            

        </script>
    </head>
    <body></body>
</html>
